const obj = {
  date: [1, 3, 5],
  teachers: {
    '莫老师': 'ECMAScript 6+ 基础,异步处理专题,DOM 详解,BOM,Event 事件',
    '余老师': '面向对象&继承&组件开发,ES6 高阶使用,node.js,前后端数据交互,搞定移动端,正则表达式',
    '张老师': 'for 循环和this指向,ECMAScript数据类型及类型转换,Function 详解,定时器和日期对象,数组和字符串方法,动画专题训练',
    '钟老师': 'React,Vue,git,面试,课程总结'

  },
  details: [
    {
      title: 'for 循环和this指向-1',
      content: `
          前端章内容回顾  
          if 和 布尔值
          Js 属性操作
          点击切换图片
          `,
      catg: 'for 循环和this指向'
    },
    {
      title: 'for 循环和this指向-2',
      content: `
          组成循环的四大要素  
          For 循环执行顺序
          案例：循环生成拼图
          函数的 this 指向
          `,
      catg: 'for 循环和this指向'
    },

    {
      title: 'for 循环和this指向-3',
      content: `
          自定义复选控件 
          classList 
          自定义单选控件
          腾讯选项卡实现
          新浪下拉菜单控件
          `,
      catg: 'for 循环和this指向'

    },

    {
      title: 'ECMAScript数据类型及类型转换',
      content: `
            ECMAScript 数据类型划分
            传值和传址
            typeof 运算符
            NaN 和 isNaN
            强制数据类型转换
        `,
      catg: 'ECMAScript数据类型及类型转换'
    },
    {
      title: 'Function 详解-1',
      content: `
            函数声明和调用
            函数传参
            arguments 
            return 返回值
            getComputedStyle 
        `,
      catg: 'Function 详解'
    },
    {
      title: 'Function 详解-2',
      content: `
            JS预解析机制
            函数传参
            作用域、作用域链 
            闭包
            call 和 apply
            bind 及 bind 原理解析
        `,
      catg: 'Function 详解'
    },
    {
      title: '定时器和日期对象',
      content: `
          定时器管理
          站长之家导航
          淘宝自动播放的选项卡
          电子时钟
          `,
      catg: '定时器和日期对象'
    },
    {
      title: '数组和字符串方法-1',
      content: `
            员工信息排序和筛选
            文字筛选和替换
            打字机效果
        `,
      catg: '数组和字符串方法'

    },
    {
      title: '数组和字符串方法-2',
      content: `
            伪3D图片切换
            随机打乱图片
        `,
      catg: '数组和字符串方法'
    },
    {
      title: '动画专题训练-1',
      content: `
            CSS3 transition
            CSS3 animation  
            京东渐隐渐现幻灯片实现
            水滴按钮
            requestAnimationFarme
            无缝滚动幻灯片
        `,
      catg: '动画专题训练'

    },
    {
      title: '动画专题训练-2',
      content: `
            mTween 动画框架
            韩雪冬官网首页图片切换效果  
            妙味导航实现
            水滴按钮
            requestAnimationFarme
            无缝滚动幻灯片
        `,
      catg: '动画专题训练'
    },
    {
      title: '动画专题训练-3',
      content: `
            CSS3 transform 详解
        `,
      catg: '动画专题训练'
    },
    {
      title: '动画专题训练-4',
      content: `
            时钟
            3D 图片轮播效果
        `,
      catg: '动画专题训练'
    },
    {
      title: 'ECMAScript 6+ 基础',
      content: `
           let、const、块级作用域
           解构赋值 和 展开运算符
           Map 和 Set 数据结构
           箭头函数、rest 参数、参数默认值
           新增数组、对象、字符串方法
        `,
      catg: 'ECMAScript 6+ 基础'

    },
    {
      title: '异步处理专题',
      content: `
            同步和异步
            ES6  Promise 对象详解
            Iterator（遍历器）和 for of 循环
            Generator 函数
            Async 函数 和 await  
        `,
      catg: '异步处理专题'
    },
    {
      title: 'DOM 详解-1',
      content: `
            DOM 方法概览
            学生管理系统
        `,
      catg: 'DOM 详解'

    },
    {
      title: 'DOM 详解-2',
      content: `
            动态文件夹创建
            上移下移
        `,
      catg: 'DOM 详解'
    },
    {
      title: 'BOM-1',
      content: `
            BOM 知识点概览
            淘宝搜索框吸顶效果
            动画回到顶部效果
        `,
      catg: 'BOM'
    },
    {
      title: 'BOM-2',
      content: `
            hash 切换的招聘面板 
        `,
      catg: 'BOM'
    },
    {
      title: 'Event 事件-1',
      content: `
            事件监听器
            冒泡和捕获
            Event 事件对象详解
            事件源 和 事件代理
        `,
      catg: 'Event 事件'
    },
    {
      title: 'Event 事件-2',
      content: `
            放大镜效果
            浏览器的默认行为 和 取消默认行为
            右键菜单事件 和 自定义右键菜单
            键盘移动操作图片轮播
            只能输入数字的输入框
        `,
      catg: 'Event 事件'
    },
    {
      title: 'Event 事件-3',
      content: `
            拖拽思路详解
            鼠标滚轮事件
            自定义滚动条控件
        `,
      catg: 'Event 事件'
    },
    {
      title: 'Event 事件-4',
      content: `
            碰撞检测及框选
            邮箱的批量操作及拖拽删除
        `,
      catg: 'Event 事件'
    },
    {
      title: '面向对象&继承&组件开发-1',
      content: `
            面向过程与面向对象
            工厂模式及构造函数
            prototype 原型
            混合构造函数/原型方法
            面向对象编程(OOP)总结
        `,
      catg: '面向对象&继承&组件开发'
    },
    {
      title: '面向对象&继承&组件开发-2',
      content: `
            对象的原型链查找规则
            包装对象 是什么意思
            构造函数继承
            原型链继承
            贝继承，深拷贝和浅拷贝
        `,
      catg: '面向对象&继承&组件开发'
    },
    {
      title: '面向对象&继承&组件开发-3',
      content: `
            class 、extend 、super
            组件开发
            addEventListener事件机制的实现
        `,
      catg: '面向对象&继承&组件开发'
    },
    {
      title: '面向对象&继承&组件开发-4',
      content: `
            简易 JQ 工具库实现
        `,
      catg: '面向对象&继承&组件开发'
    },
    {
      title: 'ES6 高阶使用',
      content: `
            数据劫持原理分析
            defineProperty
            Proxy
            模块化编程
        `,
      catg: 'ES6 高阶使用'
    },
    {
      title: 'node.js-1',
      content: 'node.js',
      catg: 'node.js'
    },
    {
      title: 'node.js-2',
      content: 'KOA',
      catg: 'node.js'
    },
    {
      title: 'node.js-3',
      content: 'KOA',
      catg: 'node.js'
    },
    {
      title: '前后端数据交互-1',
      content: `
            Ajax
        `,
      catg: '前后端数据交互'
    },
    {
      title: '前后端数据交互-2',
      content: `
            同源策略
            跨域
        `,
      catg: '前后端数据交互'
    },
    {
      title: '前后端数据交互-3',
      content: `
          Fetch，
          axios
        `,
      catg: '前后端数据交互'
    },
    {
      title: '搞定移动端-1',
      content: `
          touch事件
          TouchEvent 
        `,
      catg: '搞定移动端'
    },
    {
      title: '搞定移动端-2',
      content: `
          移动端的陀螺仪操作 
          摇一摇
          节流防抖
        `,
      catg: '搞定移动端'
    },
    {
      title: '正则表达式',
      content: '正则表达式',
      catg: '正则表达式'
    },
    {
      title: 'React.js-1',
      content: `
          JSX,
          React 组件
          React 组件通信
        `,
      catg: 'React'
    },
    {
      title: 'React.js-2',
      content: `
          生命周期
          refs
          脚手架
        `,
      catg: 'React'
    },
    {
      title: 'React.js-3',
      content: `
          React-Router
        `,
      catg: 'React'
    },
    {
      title: 'React.js-4',
      content: `
          Redux
          redux-saga 
        `,
      catg: 'React'
    },
    {
      title: 'vue.js-1',
      content: `
          Vue 指令  
        `,
      catg: 'Vue'
    },
    {
      title: 'vue.js-2',
      content: `
          Vue 组件
          Vue 插件
        `,
      catg: 'Vue'
    },
    {
      title: 'vue.js-3',
      content: `
          Vue-cli 
        `,
      catg: 'Vue'
    },
    {
      title: 'vue.js-4',
      content: `
          vue-router
        `,
      catg: 'Vue'
    },
    {
      title: 'vue.js-5',
      content: `
          Vuex
        `,
      catg: 'Vue'
    },
    {
      title: 'git',
      content: `
          git
        `,
      catg: 'git'
    },
    {
      title: '面试-1',
      content: `
          Promise 源码解析,
          事件轮询(Event loop)、宏任务、微任务
        `,
      catg: '面试'
    },
    {
      title: '面试-2',
      content: `
          函数式编程、函数柯里化
          简历编写
        `,
      catg: '面试'
    },
    {
      title: '课程总结',
      content: `
          课程总结
        `,
      catg: '课程总结'
    }
  ]
}
const catgTeachers = {}
Object.entries(obj.teachers).forEach(val => {
  const [ name, catg ] = val
  catg.split(',').forEach(v => {
    catgTeachers[v] = name
  })
})
obj.details.map(v => {
  v.teacher = catgTeachers[v.catg]
  return v
})
export default obj
